#include <mips/regdef.h>
	.text
	.align	2
	.globl	Push
Push:
	# Armo el stack frame, como es leaf no guardo el ra
	subu	sp,sp,24
	sw	$fp,20(sp)
	sw	gp,16(sp)
	move	$fp,sp

	# Por ser callee, debo guardar los argumentos de la caller
	sw	a0,24($fp)	# *topePila
	sw	a1,28($fp)	# tamanioPila
	sw	a2,32($fp)	# *cantidadElementos

	lw	t0,32($fp)	# t0 = *cantidadElementos
	lw	t1,0(t0)	# t1 = cantidadElementos
	lw	t0,28($fp)	# t0 = tamanioPila
	bne	t1,t0,set	# Si cantidadElementos != tamanioPila puedo hacer push
	addi	v0,zero,0	# Sino, error, return 0
	b	fin

set:
	lw	t0,32($fp)	# t0 = *cantidadElementos
	lw	t0,0(t0)	# t0 = cantidadElementos
	sll	t1,t0,3		# t1 = cantidadElementos * 8
	lw	t0,24($fp)	# t0 = *topePila
	addu	t0,t1,t0	# *topePila = *topePila + cantidadElementos
	l.d	$f0,40($fp)	# Cargo en f0 el valor a guardar
	s.d	$f0,0(t0)	# Guardo el f0 en la pila
	lw	t0,32($fp)	# t0 = *cantidadElementos
	lw	t1,32($fp)	# t1 = *cantidadElementos
	lw	t1,0(t1)	# t1 = cantidadElementos
	addu	t1,t1,1		# cantidadElementos++
	sw	t1,0(t0)	# Guardo cantidadElementos
	addi	v0,zero,1	# return 1

fin:
	# Desarmo el stackframe
	move	sp,$fp
	lw	$fp,20(sp)
	lw	gp,16(sp) 
	addu	sp,sp,24
	j	ra
